<?php

/**
 * Connexion MySQL
 *
 * @package cass
 * @author Mickaël CASTANHEIRO <mickael.castanheiro@gmail.com>
 * @version 1.0
 */

namespace cass;

use \PDO;

class MySQL {

    static private $pdo;

    private function __construct() {}

    /**
     * Retourne l'instance de pdo (unique)
     * @return <PDO> Objet PDO unique
     */
    private static function getPdo() {
        if (!(self::$pdo instanceof PDO)) {
            try {
                self::$pdo = new PDO('mysql:dbname=' . Data::database('dbname') . ';host=' . Data::database('host'),
                                Data::database('user'),
                                Data::database('password'),
                                array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
                self::$pdo->exec('SET CHARACTER SET utf8');
            } catch (PDOException $error) {
                echo '<strong>Impossible de se connecter à la base de données</strong>';
                exit;
            }
        }
        return self::$pdo;
    }

    /**
     * Sélectionne des données
     * @param <type> $_request
     * @param <type> $_bind
     * @return <array> Données trouvées
     */
    public static function select($_request, $_bind=array()) {
        if (strpos($_request, 'SELECT') === false) {
            echo '<strong>La fonction select n\'accepte que les requêtes SELECT</strong>';
            exit;
        }

        $pdo = self::getPdo();
        $statement = $pdo->prepare($_request);
        $statement->execute($_bind);
        $statement->setFetchMode(PDO::FETCH_OBJ);

        return $statement->fetchAll();
    }

    /**
     * Sélectionne la première ligne des données
     * @param <type> $_request
     * @param <type> $_bind
     * @return <object> données
     */
    public static function selectOne($_request, $_bind=array()) {
        if (strpos($_request, 'SELECT') === false) {
            echo '<strong>La fonction selectOne n\'accepte que les requêtes SELECT</strong>';
            exit;
        }

        $pdo = self::getPdo();
        $statement = $pdo->prepare($_request);
        $statement->execute($_bind);
        $statement->setFetchMode(PDO::FETCH_OBJ);
        return $statement->fetch();
    }

    /**
     * Compte le nombre de lignes
     * @param <type> $_request
     * @param <type> $_bind
     * @return <integer> nombre d'enregistrements
     */
    public static function count($_request, $_bind=array()) {
        if (strpos($_request, 'SELECT') === false) {
            echo '<strong>La fonction count n\'accepte que les requêtes SELECT COUNT</strong>';
            exit;
        }

        $pdo = self::getPdo();
        $statement = $pdo->prepare($_request);
        $statement->execute($_bind);
        return $statement->fetchColumn(0);
    }

    /**
     * Met à jour 
     * @param <type> $_request
     * @param <type> $_bind
     * @return <mixed>
     */
    public static function update($_request, $_bind=array()) {
        if (strpos($_request, 'UPDATE') === false) {
            echo '<strong>La fonction update n\'accepte que les requêtes UPDATE</strong>';
            exit;
        }

        $pdo = self::getPdo();
        $statement = $pdo->prepare($_request);
        return $statement->execute($_bind);
    }

    /**
     * Insère
     * @param <type> $_request
     * @param <type> $_bind
     * @return <mixed>
     */
    public static function insert($_request, $_bind=array()) {
        if (strpos($_request, 'INSERT') === false) {
            echo '<strong>La fonction insert n\'accepte que les requêtes INSERT</strong>';
            exit;
        }

        $pdo = self::getPdo();
        $statement = $pdo->prepare($_request);
        $statement->execute($_bind);
        return $pdo->lastInsertId();
    }

    /**
     * Insère plusieurs enregistrements pour la même requete
     * @param <type> $_request
     * @param <type> $_bindArr
     * @return <mixed>
     */
    public static function insertMulti($_request, $_bindArr=array()) {
        if (strpos($_request, 'INSERT') === false) {
            echo '<strong>La fonction insertMulti n\'accepte que les requêtes INSERT</strong>';
            exit;
        }

        $pdo = self::getPdo();
        $statement = $pdo->prepare($_request);
        $ids = array();
        foreach ($_bindArr AS $bind) {
            $statement->execute($bind);
            $ids[] = $pdo->lastInsertId();
        }
        return $ids;
    }

    /**
     * Supprime
     * @param <type> $_request
     * @param <type> $_bind
     * @return <mixed>
     */
    public static function delete($_request, $_bind=array()) {
        if (strpos($_request, 'DELETE') === false) {
            echo '<strong>La fonction delete n\'accepte que les requêtes DELETE</strong>';
            exit;
        }

        $pdo = self::getPdo();
        $statement = $pdo->prepare($_request);
        return $statement->execute($_bind);
    }

}
